package com.caregiver.watch.business.user.helper;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Description: 邀请码辅助类
 * @Author 疆戟
 * @Date 2025/8/16 11:34
 * @Version 1.0
 */
public final class InviteCodeHelper {


    // 可用字符集：数字 + 大写字母 + 小写字母
    private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int CODE_LENGTH = 8;

    /**
     * 生成带盐值的邀请码（增强安全性）
     * @param phone 手机号
     * @param salt 盐值
     * @return 8位邀请码
     */
    public static String generateCodeFromPhoneWithSalt(String phone, String salt) {
        if (phone == null || phone.trim().isEmpty()) {
            throw new IllegalArgumentException("手机号不能为空");
        }

        // 清理手机号，只保留数字
        String cleanPhone = phone.replaceAll("[^0-9]", "");
        if (cleanPhone.isEmpty()) {
            throw new IllegalArgumentException("手机号格式不正确");
        }

        String saltedPhone = cleanPhone + (salt != null ? salt : "");

        try {
            // 使用SHA-256哈希算法
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hashBytes = digest.digest(saltedPhone.getBytes());

            // 转换为邀请码
            return convertHashToCode(hashBytes);
        } catch (NoSuchAlgorithmException e) {
            // 降级使用简单算法
            return convertSimpleAlgorithm(saltedPhone);
        }
    }

    /**
     * 将哈希值转换为邀请码
     * @param hashBytes 哈希值字节数组
     * @return 8位邀请码
     */
    private static String convertHashToCode(byte[] hashBytes) {
        StringBuilder code = new StringBuilder(CODE_LENGTH);

        // 使用哈希值的前8个字节生成邀请码
        for (int i = 0; i < CODE_LENGTH; i++) {
            // 取绝对值并模运算获取字符索引
            int index = (Math.abs(hashBytes[i]) % CHARACTERS.length());
            code.append(CHARACTERS.charAt(index));
        }

        return code.toString();
    }

    /**
     * 简单算法（备用方案）
     * @param phone 手机号
     * @return 8位邀请码
     */
    private static String convertSimpleAlgorithm(String phone) {
        StringBuilder code = new StringBuilder(CODE_LENGTH);
        long phoneNum = Long.parseLong(phone);

        // 通过数学运算生成邀请码
        for (int i = 0; i < CODE_LENGTH; i++) {
            int index = (int) ((phoneNum >> i) % CHARACTERS.length());
            code.append(CHARACTERS.charAt(Math.abs(index)));
        }

        // 如果长度不足8位，补充字符
        while (code.length() < CODE_LENGTH) {
            code.append(CHARACTERS.charAt(code.length() % CHARACTERS.length()));
        }

        return code.toString();
    }

}
